package scales.utils.collection
import scalaz._
import Scalaz._
case class DuplicateFilter[T](orig: Iterable[T])(
implicit predicate: Equal[T]) extends Iterable[T] {
def iterator() = new Iterator[T]() {
val itr = orig.iterator
var nextPair: (Boolean, T) = getNext
var isFirst = true
def getNext: (Boolean, T) =
if (itr.hasNext)
(true, itr.next)
else
null: (Boolean, T)
def hasNext = if (isFirst) {
isFirst = false
(nextPair ne null)
} else {
if (nextPair ne null) {
val cur = nextPair
nextPair = getNext
if (nextPair ne null) {
if (predicate.equal(cur._2, nextPair._2)) {
hasNext
} else {
true
}
} else {
false
}
} else false
}
def next(): T =
if (nextPair ne null) {
nextPair._2
} else throw new NoSuchElementException("next on empty iterator")
}
}